package com.jcli._socket基恩士客户端;

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * @Author PengZhiLin
 * @Date 2021/7/9 11:14
 */
public class Client {
    public static void main(String[] args)throws Exception {
        //1.创建Socket对象,指定要来连接的服务器的ip地址和端口号
        Socket socket = new Socket("127.0.0.1",7777);

        //2.创建字节输入流对象,关联要拷贝的文件路径
        FileInputStream fis = new FileInputStream("input.txt");

        //3.通过Socket对象获得字节输出流对象
        OutputStream os = socket.getOutputStream();

        //4.定义一个byte数组,用来存储读取到的字节数据
        byte[] bys = new byte[8192];

        //4.定义一个int变量,用来存储读取到的字节个数
        int len;

        //5.循环读字节数据
        System.out.println("客户端开始上传文件数据...");
        while ((len = fis.read(bys)) != -1) {
            //6.在循环中,写字节数据到连接通道中
            os.write(bys,0,len);
        }
        System.out.println("客户端上传文件数据完毕...");
        // 问题: 服务器一直在循环读客户端写过来的数据,但是客户端已经写完了数据
        // 原因: 服务器不知道客户端写完了数据,还一直在循环读连接通道中客户端写过来的数据
        // 解决: 客户端不写数据给服务器,应该告诉服务器不再写数据了,服务器就可以终止循环读数据
        socket.shutdownOutput();

        //7.通过Socket对象获得字节输入流
        InputStream is = socket.getInputStream();

        //8.读服务器回写的字符串信息
        int len2 = is.read(bys);//卡 等待读取
        System.out.println(new String(bys,0,len2));

        //9.释放资源
        fis.close();
        socket.close();
    }
}
